﻿using System;
using Infragistics.Composite.Wpf.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Infragistics.Composite.Wpf.Samples.ClockModule.Tests
{
    [TestClass()]
    public class ClockViewModelTest : TestWithActiveDispatcher
    {
        #region Boilerplate Code

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        // 
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Use ClassCleanup to run code after all tests in a class have run
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Use TestInitialize to run code before running each test
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Use TestCleanup to run code after each test has run
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion

        #endregion // Boilerplate Code

        ClockViewModel _clockViewModel;
        string _currentTime;

        [TestMethod()]
        public void CurrentTimeTest()
        {
            _clockViewModel = null;
            _currentTime = null;

            base.BeginExecuteTest();

            DateTime actualTime = DateTime.Parse(_currentTime);
            TimeSpan elapsed = DateTime.Now - actualTime;
            Assert.IsTrue(elapsed.TotalSeconds < 3, "Clock returned the wrong time.");
        }

        protected override void ExecuteTestAsync()
        {
            _clockViewModel = new ClockViewModel();
            _clockViewModel.PropertyChanged +=
                (sender, e) =>
                {
                    _currentTime = _clockViewModel.CurrentTime;
                };

            _clockViewModel.Start();
            base.WaitWithoutBlockingDispatcher(TimeSpan.FromSeconds(2));
            _clockViewModel.Stop();

            base.EndExecuteTest();
        }
    }
}